home *** CD-ROM | disk | FTP | other *** search
- /**
- * rmFxIcalMail.js
- *
- <p> SEND:
- <ul> Reminderfox events stored in the users list can be send using the TB/mail facility.
- <br> Sending modes are:
- <br> - just send one or more events from the list to another
- user, this is the METHOD:PUBLISH.
- <br> - send one event as "Invitation" or "Schedule", this is
- based on RFC2446 (iTIP)
- <p> Current implementation supports:
- <br> -- METHOD: PUBLISH, REQUEST, REPLY
- </ul>
- RECEIVE:
- <ul> ICS-file with RFC2445 (iCalendar) data is read and added
- to the Reminderfox.ics file.
- <br> The ICS-data can be part of the body or attached as an ICS file.
- <br> The data is interpreted in conformance to RFC2446 and supports:
- <br> -- METHOD: PUBLISH, REQUEST, REPLY, CANCEL
- </ul>
- NOTE:
- <br> Both RFC's are not covered in all aspects, for actual implementation
- please refer to 'RmFx_iCal_iTIP_Implementation.pdf'
-
- <p> @since
- 2008-04-14
- <ul> - messageID added to event. This enables to call msg from reminder
- and reminder from msg;
- <br> - msg tagging with iCal METHOD;
- <br> - D&D added;
- <br> - Attendee can process CANCEL send by Organizer;
- <br> - supports rmFxUtil.PromptAlert(msg) instead of plain 'alert';
- <br>
- 2009-03 D&D: moved to 'utils/rmFxDragDrop.js'
- </ul>
- * @see 'RmFx_iCal_iTIP_Implementation.pdf'
- */
-
- var rmFx_fromMailadr;
- var rmFx_iCalMETHOD;
- var rmFx_iCalAttendees;
- var rmFx_iCalOrganizer;
- var rmFxMessageId;
- var rmFxIcalLastEvent;
-
-
- /**
- * Processes message for iCal-content
- <P> 1. reads data from 'msgHdr'
- <br> 2. reads mail ICS-data from
- <br> (a.) mail-inline (body)
- <br> (b.) first attachment including a iCal data set
- <br> If iCal found, passes to add the event, if no iCal will add a reminder
- for the message to the event list
-
- <P> @return rv true: if iCal/ICS data found
- */
- function rmFxGetiCalMailed() {
- var rv = false;
- var ret = "\n";
-
- // --- get some msgHeader Infos ------
- var msgHdr = gDBView.hdrForFirstSelectedMessage;
- // subject
- var rmFxSummary = msgHdr.mime2DecodedSubject;
- // from
- var rmFxFrom = msgHdr.mime2DecodedAuthor;
- rmFx_fromMailadr =rmFxFrom; // need for processing eg REPLY
-
- // recipients
- var rmFxTo = msgHdr.mime2DecodedRecipients;
-
- // messageID
- rmFxMessageId = "<" + msgHdr.messageId.replace(new RegExp(/\"/g),"") + ">";
- // date
- var dateStr = msgHdr.date;
- var time = new Date();
- time.setTime(dateStr / 1000);
-
- var timeString = reminderFox_mail_getTimeString( time );
- var dateVariableString;
- try {
- dateVariableString = reminderFox_prefs.getCharPref(REMINDER_FOX_PREF +
- "." + REMINDER_FOX_LIST_DATE_LABEL);
- } catch(e) {}
-
- var rmFxDate =reminderFox_getDateVariable( null, time, dateVariableString )
- + " " + timeString;
-
- var mInvitation = " " +reminderFox_getBundle().getString("rf.add.mail.message.date") + ": " + rmFxDate + ret
- + " " +reminderFox_getBundle().getString("rf.add.mail.message.sender") + ": " + rmFxFrom + ret
- + " " +reminderFox_getBundle().getString("rf.add.mail.message.recipients") + ": " + rmFxTo + ret ;
-
- var _baseURI= this.content.document.body.baseURI;
- var _content= this.content.document.body.textContent;
- var _contentType= this.content.document.contentType;
- var _documentURI= this.content.document.documentURI;
- var _title= this.content.document.title;
-
- // 1a. check if events in the body, pass to "Add Reminder"
- var rvTxt = rmFxGetiCalFromTextBody(_content, mInvitation);
-
- if (rvTxt == true) return; // the event is read from the boday, so done!
-
- //2. check Attachments for events, pass to "Add Reminder"
-
- if (currentAttachments.length > 0) {
- var i=0;
- while (i < currentAttachments.length) {
- var xx = currentAttachments[i].contentType.toLowerCase();
- if ( (xx == "text/calendar") /* 'normal apps */
- || (xx == "application/ics") /* Google Calendar */
- || (xx == "application/octet-stream")) { /* some calendars do not identify as calendar type */
- var _contentType = xx;
- var _url = currentAttachments[i].url;
- var _name = "iCalMsgAttReceive" + i + ".txt";
- var _uri = currentAttachments[i].uri;
-
- var temp = Components.classes["@mozilla.org/file/directory_service;1"]
- .getService(Components.interfaces.nsIProperties)
- .get("TmpD", Components.interfaces.nsIFile);
-
- var attfile = messenger.saveAttachmentToFolder(
- _contentType, _url, _name, _uri, temp, null);
-
- // delete the temporary file automatically on exit <<< //gW_PB for Postbox
- externalAppLauncher.deleteTemporaryFileOnExit(attfile);
-
- // we need Timeout ---> +++2do use eventhandler instead!!
- setTimeout(rmFxGetiCalFromAttachment,500, mInvitation, attfile, _content, rmFxMessageId);
- // rmFxGetiCalFromAttachment(mInvitation, attfile, _content, rmFxMessageId);
-
- rv = true;
- }
- i++;
- }
- }
-
- // 3. coming to here with rv=false, probably the msg was D&D from mail:3pane
- // +++2do check +++2do check +++2do check +++2do check +++2do check +++2do check +++2do check +++2do check
- if (rv == false) {
- reminderFox_thunderBirdAddEmailReminder();
- }
-
- rmFxIcalLastEvent = null;
- return rv;
- }
-
- /**
- * Read iCal/ICS data from attachment, if no data found alternativly check the body of the message
- *
- * @param mInvitation --> METHOD as with RFC defined
- * @param attfile --> temp file() of attachment
- * @param content --> messages body text
- * @param rmFxMessageId --> the msgHdr.messageId
- * @return
- */
- function rmFxGetiCalFromAttachment(mInvitation, attfile, content, rmFxMessageId) {
- var rv;
- var reminderFoxEvents = new Array();
- var reminderFoxTodosArray = { };
- reminderFox_readInRemindersAndTodosICSFromFile(reminderFoxEvents, reminderFoxTodosArray, attfile, true);
-
- // check if we've successfully found any reminders or todo events
- var foundEventsInAttachment = reminderFoxEvents.length != 0;
- if ( !foundEventsInAttachment ) {
- for ( var n in reminderFoxTodosArray ) {
- var importedTodos = reminderFoxTodosArray[n];
- if ( importedTodos.length > 0 ) {
- foundEventsInAttachment = true;
- break;
- }
- }
- }
-
- // if so, read-in from the attachment
- if ( foundEventsInAttachment ) {
- rv = rmFxGetiCalEvents( mInvitation, reminderFoxEvents, reminderFoxTodosArray);
- }
- rmFx_iCalTagging (rv);
-
- return rv;
- }
-
- function rmFx_iCalTagging (rv) {
- if ((rmFx_iCalMETHOD != "") && (rv == true)){
- rmFx_msgTAGing('iCal-' + rmFx_iCalMETHOD, true, '#3333FF');
- }
- }
-
-
- /**
- * Support FX D&D a URL with ICS download link
- <br> ex: http://dl.erweiterungen.de/kalenderdateien/Feiertage_2006-2010_DE.ics
- *
- * @param url
- *
- * @since 2008-10-30
- * @todo just supports only subscription not import from (url)
- */
- function rmFxSubscribeOrAddReminder(url) {
-
- // --- ask user to subscribe or add as reminder ---
- var title = reminderFox_getBundle().getString('rf.options.subscribe.title');
- var msg = reminderFox_getBundle().getString('rf.options.subscribe.description1')
- + '\n' + reminderFox_getBundle().getString('rf.options.subscribe.description2');
- var key0 = reminderFox_getBundle().getString('rf.options.subscribe');
- var key1 = reminderFox_getBundle().getString('rf.button.cancel');
- var key2 = reminderFox_getBundle().getString('rf.options.subscribe.add2reminders');
-
- switch (rmFxUtil.ConfirmEx(title, msg, key0, key1, key2) ) {
- case 0:
- reminderFox_subscribeWithReminderFox(url); break;
- case 1:
- alert ("Canceled, see you ;-)");
- break;
- case 2:
- // GetICSfromHTTP(url);
- // ++++2do ++++2do ++++2do ++++2do ++++2do ++++2do ++++2do
- // needs FX download from url and handle as new reminder
- alert ("Sorry, coming soon ;-)");
- // ++++2do ++++2do ++++2do ++++2do ++++2do ++++2do ++++2do
- break;
- }
- }
-
- function rmFxGetiCalFromTextBody(_content, mInvitation) {
- var reminderFoxEvents = new Array();
- var reminderFoxTodosArray = { };
-
- reminderFox_readInRemindersAndTodosICSFromString(reminderFoxEvents, reminderFoxTodosArray, _content, true);
-
- var rv = rmFxGetiCalEvents(mInvitation, reminderFoxEvents, reminderFoxTodosArray);
- return rv;
- }
-
- function rmFxGetiCalEvents( mInvitation, reminderFoxEvents, reminderFoxTodosArray) {
- // here we need to know the METHOD of the event
- // with "send" it's set by processing before
- // with "receive" it's written to "this.reminderfox_Method"
- rmFx_iCalMETHOD = this.reminderfox_Method;
-
- // now iterate over each event and do special processing
- // get infos into reminder.notes ... depended of "METHOD"
- for ( var i = 0; i < reminderFoxEvents.length; i++ ) {
- var reminder = reminderFoxEvents[i];
- var result = reminderFox_processExtraScheduleInfo(reminder, mInvitation, rmFx_iCalMETHOD );
- if (result != "") {
- rmFxUtil.PromptAlert(result);
- return false;
- }
- }
-
- // #1 handle multiple VEVENT OR VTODO -->> import them all with normal import
- for ( var list in reminderFoxTodosArray ) {
- var cList = reminderFoxTodosArray[list];
- }
-
- if ((reminderFoxEvents.length >1) || (!!cList)) {
-
- // prompt the user to import
- var title = reminderFox_getBundle().getString("rf.mail.ical.import.overwrite.title");
- var msg = reminderFox_getBundle().getString("rf.mail.ical.import.overwrite.description");
- var key0 = reminderFox_getBundle().getString("rf.button.ok");
- var key1 = reminderFox_getBundle().getString("rf.button.cancel");
-
- if (rmFxUtil.ConfirmEx(title, msg, key0, key1) == 1 ) { // cancel pressed
- return false;
- }
-
- // add 'Category' items to every event
- for (var i = 0; i < reminderFoxEvents.length; i++) {
- reminderFoxEvents[i].categories = reminderFoxEvents[i].categories + ",iEvent";
- }
- reminderFox_addMultipleEvents(reminderFoxEvents, reminderFoxTodosArray);
-
- return true;
- }
-
- // #2a single Event/Schedule.
- // Check for Reminders passed. None --> return false;
- var reminder = reminderFoxEvents[0]; // the 'read' reminder
- if (reminder == null) return false; // no Reminders, return
-
- // check if previous event is the same as this one (POSTBOX workaround)
- try {
- if ((reminder.id == rmFxIcalLastEvent.id)
- && (reminder.extraInfo == rmFxIcalLastEvent.extraInfo)) {
- // rmFxUtil.PromptAlert(" here we have an duplicated event");
- rmFxIcalLastEvent = null;
- return false;
- }
- } catch (ex) {}
- rmFxIcalLastEvent = reminder;
-
- // #2b loop with all reminders in list and check if already in reminder.ics
- // known: return false
- // new: call the "Add Reminder" dialog, return "true" if finally added,
- // "false" if user suspend adding
- var rmFx_statusMsg="";
- reminder.messageID = rmFxMessageId;
-
- var newExtra = rmFx_extraInfoArray(reminder); // the 'extraInfo' items
-
- var activeReminders = reminderFox_getReminderEvents();
-
- for (var nR =0; nR < activeReminders.length; nR++) {
- if (reminder.id == activeReminders[nR].id ) {
- // reminder already known, check for details and alert it.
-
- var oldExtra = rmFx_extraInfoArray(activeReminders[nR]);
- var same = (rmFx_extraInfo(newExtra,"DTSTAMP"))
- == (rmFx_extraInfo(oldExtra,"DTSTAMP"))
- && (rmFx_extraInfo(newExtra,"SEQUENCE"))
- == (rmFx_extraInfo(oldExtra,"SEQUENCE")) ; //++++2do ++++2do ++++2do ++++2do ++++2do
- // check for oldSEQ > newSEQ ==> ERR
- var older = (rmFx_extraInfo(newExtra,"DTSTAMP"))
- <= (rmFx_extraInfo(oldExtra,"DTSTAMP"))
- || (rmFx_extraInfo(newExtra,"SEQUENCE"))
- < (rmFx_extraInfo(oldExtra,"SEQUENCE")) ; //++++2do ++++2do ++++2do ++++2do ++++2do
- // for oldDTSTAMP > new ==> ERR
-
- switch (rmFx_iCalMETHOD) {
-
- case "CANCEL": {
- // check if msg/cancel was already processed
- if (same == true) {
- rmFx_statusMsg = "[iCal CANCEL] " + " »" + activeReminders[nR].summary + "«"
- + "\n\n" + mInvitation
- + "\n\n" + reminderFox_getBundle().getString("rf.schedule.attendee.processed");
- rmFxUtil.PromptAlert(rmFx_statusMsg);
- return false;
- }
- if (older == true) {
- rmFx_statusMsg = "[iCal CANCEL] " + " »" + activeReminders[nR].summary + "«"
- + "\n\n" + mInvitation
- + "\n\n" + reminderFox_getBundle().getString("rf.schedule.older1.processed")
- + "\n" + reminderFox_getBundle().getString("rf.schedule.older2.processed") ;
- rmFxUtil.PromptAlert(rmFx_statusMsg);
- return false;
- }
- // save all event-items {reminder.xx} if not included
- // in CANCEL-msg {activeReminders[nR].xx}
- // reminder.categories, reminder.location, reminder.url, reminder.priority,
- // also set Description to [iCal CANCEL] ....
- //
- if (reminder.categories == null) {reminder.categories = activeReminders[nR].categories};
- if (reminder.location == null) {reminder.location = activeReminders[nR].location};
- if (reminder.url == null) {reminder.url = activeReminders[nR].url};
- if (reminder.priority == null) {reminder.priority = activeReminders[nR].priority};
- reminder.notes = reminder.notes +'\n\n' + activeReminders[nR].notes;
-
- break;
- }
-
- case "REQUEST": {
- // check if msg/reply was already processed
- if (same == true) {
- rmFx_statusMsg = "[iCal REQUEST] " + " »" + activeReminders[nR].summary + "«"
- + "\n\n" + mInvitation
- + "\n\n" + reminderFox_getBundle().getString("rf.schedule.attendee.processed");
- rmFxUtil.PromptAlert(rmFx_statusMsg);
- return false;
- }
- if (older == true) {
- rmFx_statusMsg = "[iCal REQUEST] " + " »" + activeReminders[nR].summary + "«"
- + "\n\n" + mInvitation
- + "\n\n" + reminderFox_getBundle().getString("rf.schedule.older1.processed")
- + "\n" + reminderFox_getBundle().getString("rf.schedule.older2.processed") ;
- rmFxUtil.PromptAlert(rmFx_statusMsg);
- return false;
- }
- break;
- }
-
- case "REPLY": {
- // check if msg/reply was already processed.
- // result on 'same' only doesn't say if the current
- // processed msg was already processed.
- // So we check if a TAG 'iCal-Reply' is added to the msg.
-
- // this.currentHeaderData.tags.headerValue
- var msgHdr = gDBView.hdrForFirstSelectedMessage;
- var msgKeys = msgHdr.getStringProperty("keywords");
- if ((same == true) && (msgKeys.indexOf("iCal-REPLY") > -1)) {
-
- var msg = "[REPLY] " + " »" + activeReminders[nR].summary + "«"
- + "\n\n" + mInvitation
- + "\n\n" + reminderFox_getBundle().getString("rf.schedule.attendee.processed");
- if (confirm(msg + "\n\n" + reminderFox_getBundle().getString("rf.schedule.processReply")) == false) {
- return false;
- }
- }
-
- var attNo;
-
- rmFx_fromMailadr = msgHdr.mime2DecodedAuthor;
-
- var fromAttendee = rmFx_fromMailadr.substring(
- rmFx_fromMailadr.indexOf( "<" ) + 1,
- rmFx_fromMailadr.indexOf( ">" ));
- var fromATT = fromAttendee.toUpperCase();
-
- for ( var i = 0; i < rmFx_iCalAttendees.length; i++ ) {
- if (rmFx_iCalAttendees[i].toUpperCase().indexOf(fromATT) > -1) attNo=i;
- }
- // is the "from" address == the ATTENDEE ??,
- // if NOT --> unknown CU ( + a "Party Crasher") ...
- // So we have to ask the user which ATTENDEE has to be taken here
- if (rmFx_iCalAttendees[attNo] == null) {
-
- var results = { attendees:rmFx_iCalAttendees };
- window.openDialog("chrome://reminderfox/content/mail/rmFxReplyAttendees.xul",
- "rmFx-set-getReplyAttendee", "chrome,resizable,modal", results);
- // CANCEL and not seleteced == -1
- // OK and selected == #
- if (results.attendeeNo == -1){
- return false;}
-
- var xx= rmFx_iCalAttendees[results.attendeeNo];
-
- var fndIndex = xx.toUpperCase().lastIndexOf( "MAILTO:" );
- if (fndIndex == -1) { return false};
- var fromATT = xx.substring( fndIndex + 7).toUpperCase();
- }
- // clone the stored event and update some items from
- // newEvent [REPLY] to oldEvent [the stored]
- // - save the .notes
- var replyReminderNotes = reminder.notes;
-
- // - ATTENDEE grap the new
- for ( var i = 0; i < newExtra.length; i++ ) {
- if (newExtra[i].toUpperCase().indexOf(fromATT) > -1) var iNew=i;
- }
- for ( var i = 0; i < oldExtra.length; i++ ) {
- if (oldExtra[i].toUpperCase().indexOf(fromATT) > -1) var iOld=i;
- }
- oldExtra[iOld] = newExtra[iNew];
-
- // rebuild the extraInfo string
- for ( var i = 0; i < oldExtra.length; i++ ) {
- if (i==0) {activeReminders[nR].extraInfo = oldExtra[i];
- } else {
- activeReminders[nR].extraInfo += "\\n" + oldExtra[i];}
- }
-
- reminder = activeReminders[nR];
- reminder.notes = replyReminderNotes
- + "\n _._._._._._._ " + reminderFox_getBundle().getString("rf.schedule.previous") + " _._._._._._._\n"
- + activeReminders[nR].notes;
- break;
- } //METHOD:REPLY
-
- default: {//METHOD: ... all other (for the moment)
- // get info from reminder 'in the list'
-
- var rSEQ = rmFx_extraInfo(oldExtra,'sequence')
- var rDTSTAMPz = rmFx_extraInfo(oldExtra,'dtstamp');
-
- var rDTSTAMP = "";
- if (rDTSTAMPz != null ) {
- rDTSTAMP= reminderFox_parseDateTimes(rDTSTAMPz) ;
- }
- // get info from 'new' reminder
- var nSEQ = rmFx_extraInfo(newExtra,'sequence');
- var nDTSTAMPz = rmFx_extraInfo(newExtra,'dtstamp');
-
- var nDTSTAMP = "";
- if ( nDTSTAMPz != null ) {
- nDTSTAMP = reminderFox_parseDateTimes(nDTSTAMPz) ;
- }
- var newStr = reminderFox_getBundle().getString("rf.schedule.new");
- var oldStr = reminderFox_getBundle().getString("rf.schedule.old");
-
- var info1 = reminderFox_getBundle().getString("rf.reminder") + " [ " + activeReminders[nR].summary + " ] \n"
- +reminderFox_getBundle().getString("rf.schedule.check.summary")+ nR + "\n\n";
-
- var info2 = "\n\nSEQUENCE\n "+ newStr +": [#" + nSEQ + "] "+ oldStr +": [#" + rSEQ
- + "]\nDTSTAMP \n "+ newStr +": [" + nDTSTAMP + "] "+ oldStr +": [" + rDTSTAMP + "]";
-
- if ((nSEQ *1) > (rSEQ*1)) { // new SEQUENCE should be greater
- rmFx_statusMsg = reminderFox_getBundle().getString("rf.schedule.new") + " '" + reminderfox_Method + "' "
- + " SEQUENCE" + " #" + nSEQ ;
- // alert (info1 + rmFx_statusMsg + info2) ;
- } else {
- if (nDTSTAMPz <= rDTSTAMPz ) {
- rmFx_statusMsg = 'SEQUENCE / DTSTAMP ' + reminderFox_getBundle().getString("rf.schedule.notValid");
- rmFxUtil.PromptAlert(info1 + rmFx_statusMsg + info2) ;
- return false;
-
- } else {
- rmFx_statusMsg = reminderFox_getBundle().getString('rf.schedule.newDate') + ' [' + nDTSTAMP + ']';
- // alert (info1 + rmFx_statusMsg + info2) ;
- }
- }
-
- if (rmFx_statusMsg != "" && activeReminders[nR].notes != null) {
- reminder.notes += "\n _._._._._._._ "
- + reminderFox_getBundle().getString("rf.schedule.previous")
- + " _._._._._._._\n" +
- activeReminders[nR].notes
- }
- } // METHOD ... all other
- } // switch
- } // reminder already known
- } //#2a -- loop with all reminders in list
-
- var rv = reminderFox_addReminderHeadlessly( reminder, true, true ); // gW 2009-02-25 edit flag added
- return rv; // should be true if added to list, so tag the msg
- }
-
-
- function reminderFox_processExtraScheduleInfo(reminder, mInvitation, rmFx_Method ) {
- /* here we prepare the reminder.notes to reflect special schedule items
- */
- var msgReturn="";
-
- if ( reminder.extraInfo == null ) return msgReturn;
-
- // here we need to know the METHOD of the event
- // it's written to "this.reminderfox_Method"
- // eg. REPLY, REQUEST, CANCEL, COUNTER, DECLINECOUNTER
-
- //var rmFx_iCalMETHOD = this.reminderfox_Method;
-
- var addPerson = "";
- var addOption=""; var iSchComment = null; var iSchStatus = null;
- var nDTSTAMP; var iSchStart; var iSchEnd;
- var option ="";
- var ret = "\n";
-
- var extraInfos = rmFx_extraInfoArray(reminder);
-
- var nDTSTAMPz = rmFx_extraInfo(extraInfos,"DTSTAMP");
- if ( nDTSTAMPz != "" ) {
- nDTSTAMP = reminderFox_parseDateTimes(nDTSTAMPz) ;
- }
- var nSEQ = rmFx_extraInfo(extraInfos,"SEQUENCE");
-
- option = rmFx_extraInfo(extraInfos,"COMMENT");
- if ( option != "" )
- iSchComment = option + ret;
-
- // next items go with 'addOption' to Notes
- function addOptItem (option, optText) {
- // var option = rmFx_extraInfo(extraInfos,"PRIORITY");
- return ((option == null) || (option == ""))
- ? ""
- : " " + optText + " [" + option + "]";
- }
- addOption += addOptItem (rmFx_extraInfo(extraInfos,"PRIORITY"), "Priority");
- addOption += addOptItem (rmFx_extraInfo(extraInfos,"CLASS"), "Class");
- addOption += addOptItem (rmFx_extraInfo(extraInfos,"CUTYPE"), "CuType");
- addOption += addOptItem (rmFx_extraInfo(extraInfos,"TRANSP"), "TRANSP");
-
- // ---->> process PERSONS infos ------
- var myMailAccounts = rmFxMsg.myMailIDs();
-
- rmFx_iCalOrganizer = rmFx_extraInfo(extraInfos,"ORGANIZER", ";");
-
- // check if ORGANIZER is part of my accounts,
- // if METHOD:REPLY it has to be! Else ERROR, don't add to reminder.ics
- if (rmFx_Method == "REPLY") {
- var fndIndex = rmFx_iCalOrganizer.toUpperCase().lastIndexOf( "MAILTO:" );
- if (fndIndex != -1) {
- var fndString = "<" + rmFx_iCalOrganizer.substring( fndIndex + 7) + ">";
- if (myMailAccounts.indexOf(fndString) == -1 ) {
- msgReturn = "[REPLY] " +reminderFox_getBundle().getString("rf.schedule.replyWrongOrganizer")
- + ": \n" + fndString;
- return msgReturn;
- }
- }
- }
-
- // get PARTSTAT for myAccount
- var _Attendees = rmFx_extraInfo(extraInfos,"ATTENDEE", ";", true); // true==read multiple entries
- var attPart ="";
-
- rmFx_iCalAttendees = _Attendees.split("\n");
-
- if (rmFx_iCalAttendees.length > 0 || nSEQ != null){
- for (var n=0; n<rmFx_iCalAttendees.length; n++){
- rmFx_iCalAttendees[n] = rmFx_iCalAttendees[n].toUpperCase();
- var fnd = rmFx_iCalAttendees[n].lastIndexOf("MAILTO:");
- if (fnd != -1) {
- var address = rmFx_iCalAttendees[n].substring(fnd+7);
- if (address.indexOf(myMailAccounts)) {
-
- fnd = rmFx_iCalAttendees[n].indexOf("PARTSTAT=");
- if (fnd != -1) {
- var attPart = rmFx_iCalAttendees[n].substring(fnd+9);
- fnd = attPart.indexOf(";");
- if (fnd == -1) {attPart.indexOf(":")};
- var attPart = attPart.substring(0,fnd);
- }
- }
- }
- }
- }
- var wPART ="";
- if (rmFx_Method != "REQUEST") { var wPART = " " + attPart; }
- var extraInfoSchedule = "[iCal] " + rmFx_Method + wPART + ": " + reminderFox_getBundle().getString("rf.schedule") ;
- if ( nDTSTAMP != null && nDTSTAMP.length > 0 ) {
- extraInfoSchedule += " " + reminderFox_getBundle().getString("rf.schedule.asof") + " " +nDTSTAMP;
- }
- if ( nSEQ != null ) {
- extraInfoSchedule += " [# " + nSEQ + "]" + ret ;
- }
- extraInfoSchedule += mInvitation + ret;
-
- // <<<---- process PERSONS infos ------
-
-
- switch (rmFx_Method) {
- case "REQUEST":
- case "PUBLISH": { // this is send to ATTENDEE(s), can be
- // - new
- // - revised
-
- // ++++++++++++ Google Calendar Special ++++++++++++
- if ( reminder.notes != null && reminder.notes.length > 0 ) {
- var iGMail = reminder.notes.toLowerCase().indexOf("http://www.google.com/calendar/event?action=view");
- if ( iGMail != -1) {
- var iGMail1 = reminder.notes.toLowerCase().indexOf(" ",iGMail);
- var httpGMail = reminder.notes.substring(iGMail,iGMail1);
- reminder.url = httpGMail;
- }
- }
- // ++++++++++++ Google Calendar Special ++++++++++++
-
- if (addOption != "" )
- extraInfoSchedule += reminderFox_getBundle().getString("rf.schedule.options") +
- " ______________________" + ret + addOption + ret;
-
- if (iSchComment != null )
- extraInfoSchedule += reminderFox_getBundle().getString("rf.schedule.comment") +
- " ______________________" + ret + iSchComment + ret;
-
- if (reminder.notes != null && reminder.notes.length > 0 ) {
- reminder.notes = "> " + reminder.notes.replace(new RegExp(/\n/g),"\n>");
- }
-
- if (reminder.notes != null ) {
- extraInfoSchedule += reminderFox_getBundle().getString("rf.schedule.description") +
- " ______________________" + ret
- + reminder.notes + ret;
- }
-
- // add category signifying that this is an invitation
- var iCalCategory = reminderFox_getBundle().getString("rf.mail.ical.send.subject.invitation"); // "invitation";
- var iCalCategoryLC = iCalCategory.toLowerCase(); // "invitation";
- if ( reminder.categories != null && reminder.categories.length > 0 ) {
- if (reminder.categories.toLowerCase().indexOf(iCalCategoryLC) == -1){
- reminder.categories = reminder.categories + ", " + iCalCategory;}
- } else { reminder.categories = iCalCategory;
- }
- reminder.notes = extraInfoSchedule;
- return msgReturn;
- break;
- } //case:REQUEST" & "PUBLISH"
-
- case "REPLY": { // this is send back to ORGANIZER
-
- reminder.notes = extraInfoSchedule;
- return msgReturn;
- break;
- } //case "REPLY"
-
- case "CANCEL": { // this 'cancel's the local event/invitation
-
- reminder.notes = extraInfoSchedule;
- return msgReturn;
- break;
- } //case "CANCEL"
-
- } // switch (rmFx_Method)
- return msgReturn;
- }
-
-
- function reminderFox_addMultipleEvents(reminderEvents, reminderTodos) {
- // merge
- var existingEvents = reminderFox_getReminderEvents();
- var existingTodos = reminderFox_getReminderTodos(); // ALL todos
- var rvEvent = reminderFox_mergeEvents(existingEvents, reminderEvents );
- var rvTodo = reminderFox_mergeTodos( existingTodos, reminderTodos );
-
- reminderFoxEvents = existingEvents;
- reminderFoxTodosArray = existingTodos;
-
- reminderFox_importRemindersUpdateAll(false, null );
-
- // write to status !!
- var msgText = "Events : " + rvEvent.importNo + " imported " + rvEvent.existNo + " exists."
- + "\n" + "Todo's : " + rvTodo.importNo + " imported " + rvTodo.existNo + " exists." ;
-
- rmFxCore.statusSet (msgText);
- }
-
- // ------------- GET TODO(s) ------------------------------
- /**
- *
- */
- function rmFx_getSelectedTodos () {
-
- var tabList = document.getElementById("tabList");
- var tab = tabList.selectedItem;
- var tabLabel = tab.label;
-
- var todosToBeSend = getAllSelectedTodos();
-
- if (todosToBeSend.length == 0) return;
- // todosToBeSend[0].extraInfo
- for (var i = 0; i < todosToBeSend.length; i++) {
- if (todosToBeSend[i].extraInfo == null) {
- todosToBeSend[i].extraInfo = REMINDERFOX_EXTENDED + "LISTID:" + tabLabel;
- } else {
- if (todosToBeSend[i].extraInfo.indexOf(REMINDERFOX_EXTENDED + "LISTID") == -1) {
- todosToBeSend[i].extraInfo += "\\n" + REMINDERFOX_EXTENDED + "LISTID:" + tabLabel;
- }
- }
- }
- var todoArrayArray = new Array();
- todoArrayArray[0] = todosToBeSend;
-
- return todoArrayArray;
- }
-
-
-
- // ------------- SEND / EXPORT iCal ------------------------------
- /**
- * Send/export one or more 'reminder(s)' as they are
- *
- * @param selectedReminders
- * @param organizer
- * @param mode if 'xExport' stores reminders to file
- * @param reminderTyp 'reminder' | 'todo'
- *
- */
- function rmFx_sendAsItIs (selectedReminders, organizer, mode, reminderTyp) {
- var methodTyp = "ICS";
- var attendees = null;
-
- if (mode == 'xExport') { // generate an ICS file here
-
- if (reminderTyp == 'todo') {
- var iCalString = reminderFox_constructReminderOutput( "", selectedReminders, true, true, "PUBLISH" );
- } else {
- var iCalString = reminderFox_constructReminderOutput( selectedReminders, "", true, true, "PUBLISH" );
- }
- var exportFile = reminderFox_prefsBranch.getCharPref("exportEventsFile");
-
- // rmFxUtil.dump2Console ("gWTEST: 'exportReminders to File' >>" + exportFile + "<<"); //gWTEST darwin
-
- var iCalToEmailFile = rmFxUtil.makeMsgFile (rmFxUtil.encodeUTF8(iCalString), exportFile);
- if (iCalToEmailFile == null) {
- rmFxUtil.PromptAlert("Export failed. File '" + exportFile + "' path not valid!");
- }
-
- return;
- }
-
- rmFx_sendEventNow(selectedReminders, "", 'ICS' /*methodTyp*/, organizer, attendees, reminderTyp);
- }
-
- var selectedReminders = null;
-
- /**
- * With the selected Reminder/Todo's
- * 'Export to file' or 'Send a Mail' as an INVITATION/SCHEDULE
- *
- * @param event has '.id' for selected ReminderTyp, if 'null' called from function
- * @param _selectedTyp // 'invite' | 'info'
- * @param _reminderTyp // 'reminder' | 'todo'
- * @param _Reminders //
- *
- * @return
- */
- function rmFx_ExportOrSend (event, _selectedTyp, _reminderTyp, _Reminders) {
-
- // var selectedReminders="";
- var methodTyp = "PUBLISH"; // default=PUBLISH ... other METHOD:PUBLISH, REQUEST, REPLY
- var attendees = null;
- var organizer = null;
- var selectedTyp; // 'invite' | 'info'
- var reminderTyp; // 'reminder' | 'todo'
- var eventLength; // use to show # of events in XUL title
-
- if (event == null) { // function call (eg. from 'View')
- selectedTyp = _selectedTyp;
- reminderTyp = _reminderTyp;
- selectedReminders = _Reminders;
- eventLength = selectedReminders.length;
-
- } else { // called from ReminderList popup menu
-
- if (event.currentTarget.id == "treechildren-contextmenu-sendReminder") {
- selectedTyp = 'invite';
- reminderTyp = 'reminder';
-
- selectedReminders = getAllSelectedReminders();
- var eventLength = selectedReminders.length;
- if (eventLength == 0) return; // no reminders selected!
-
- if (selectedReminders.length > 1) {
- selectedTyp = 'info'; // only 'single' events can be send as invitation
- }
- }
-
- if (event.currentTarget.id == "treechildren-contextmenu-sendTodos") {
- selectedTyp = 'info';
- reminderTyp = 'todo';
-
- selectedReminders = rmFx_getSelectedTodos();
-
- if (selectedReminders == null) {
- rmFxCore.statusSet (reminderFox_getBundle().getString("rf.schedule.resendwithDialog")) // ("No Todo's selected!");
- return;
- }
-
- var eventLength = selectedReminders[0].length;
- }
- }
-
- if (selectedTyp == 'invite') {
-
- /* have to check if the selected "Reminder" was already send as invitation/schedule;
- * that's the case if ORGANIZER is already included in "selectedReminders"
- */
- if (selectedReminders[0].extraInfo!= null) {
- if (selectedReminders[0].extraInfo.indexOf("ORGANIZER") != -1) {
- var msg = reminderFox_getBundle().getString("rf.schedule.wasSend")
- + "\n" + reminderFox_getBundle().getString("rf.schedule.resendwithDialog")
- + "\n\n" + reminderFox_getBundle().getString("rf.schedule.sendAsEvent");
-
- if (confirm(msg) == false) {
- var msg = reminderFox_getBundle().getString("rf.schedule.wantDelete")
- + "\n\n"+ reminderFox_getBundle().getString("rf.schedule.okDelete");
-
- if (confirm(msg ) == true) { // this is the 'delete invitation' part
-
- var extraInfoArrayInv = rmFx_extraInfoArray(selectedReminders[0]);
- var extraInfoArray = new Array (); var j=0;
-
- for (var i=0; i < extraInfoArrayInv.length; i++) {
- if (extraInfoArrayInv[i].indexOf("ORGANIZER") > -1 ||
- extraInfoArrayInv[i].indexOf("ATTENDEE") > -1 ||
- extraInfoArrayInv[i].indexOf("DTSTAMP") > -1 ||
- extraInfoArrayInv[i].indexOf("STATUS") > -1 ||
- extraInfoArrayInv[i].indexOf("CLASS") > -1 ||
- extraInfoArrayInv[i].indexOf("COMMENT") > -1 ||
- extraInfoArrayInv[i].indexOf("SEQUENCE") > -1 )
- {
- } else {
- extraInfoArray[j] = extraInfoArrayInv[i]; j++;
- }
- }
- // delete the 'invitation' category also
- var xCategories = selectedReminders[0].categories;
-
- var iCalCategory = reminderFox_getBundle().getString("rf.mail.ical.send.subject.invitation"); // "invitation";
- if (xCategories.indexOf(iCalCategory) > -1) {
- selectedReminders[0].categories = xCategories.replace(iCalCategory, '');
- }
-
- // write the selectedReminder back to currentReminder without 'extra' strings
- selectedReminders[0].extraInfo= extraInfoArray.join("\n");
- var reminderTodos=null;
- reminderFox_addMultipleEvents(selectedReminders, reminderTodos)
-
- rmFxUtil.PromptAlert(reminderFox_getBundle().getString("rf.schedule.hasDeleted")
- + "\n\n" + reminderFox_getBundle().getString("rf.schedule.checkDeleted"));
- }
- return;
- }
- selectedTyp ='info'; // was already send, don't allow to send as 'invite'
- }
- }
- }
- // Reminder(s) 'send' or 'export'
- // if 'CANCEL' or 'close window' pressed -->> terminate
- var results = { organizer: null,
- attendees: null,
- mode: null,
- selectedTyp: selectedTyp,
- reminderTyp: reminderTyp,
- eventLength: eventLength,
- schComment: ""};
- window.openDialog("chrome://reminderfox/content/mail/invitation.xul",
- "reminderFox-set-invitationmailAppString", "chrome,resizable,modal", results);
-
- if (results.mode == 'CANCEL') return;
-
- if (results.mode == 'xExport') { // export to ICS file
- rmFx_sendAsItIs (selectedReminders, results.organizer, results.mode, reminderTyp)
- return;
- }
-
- if (results.selectedTyp == 'info') { // send "as-it-is" ===> PUBLISH
- // rmFx_sendAsItIs (selectedReminders, results.organizer, results.mode, reminderTyp);
-
- var attendees = null;
- if (reminderTyp == 'reminder') {
- // this.selectedReminders[0].url $[1] = [string] "mailto:abc@xyz.de"
- if (this.selectedReminders.length == 1) {
- if (this.selectedReminders[0].url.indexOf('mailto:') == 0)
- attendees = this.selectedReminders[0].url.substring(7);
- }
- rmFx_sendEventNow(selectedReminders, "", 'ICS' /*methodTyp*/, organizer, attendees, reminderTyp);
- }
- if (reminderTyp == 'todo') {
- // this.selectedReminders[0][0].url $[1] = [string] "mailto:abc@xyz.de"
- if (this.selectedReminders[0].length == 1) {
- if (this.selectedReminders[0][0].url.indexOf('mailto:') == 0)
- attendees = this.selectedReminders[0][0].url.substring(7);
- }
- rmFx_sendEventNow("", selectedReminders, 'ICS' /*methodTyp*/, organizer, attendees, reminderTyp);
- }
- return;
- }
-
- // send INVITATION/SCHEDULE ===> REQUEST
- if (results.selectedTyp == 'invite') {methodTyp = 'REQUEST';}
-
- organizer = results.organizer;
- if (organizer == "") {
- rmFxUtil.PromptAlert(reminderFox_getBundle().getString("rf.schedule.organizer.required")
- + "\n" + reminderFox_getBundle().getString("rf.schedule.organizer.mailAdr"));
- return;
- }
-
- if (results.attendees != null && results.attendees != "") {
- methodTyp = "REQUEST"; // attendees where entered --> REQUEST
- } else {
- methodTyp = "PUBLISH";
- }
- // add invitation info to 'extraInfo' item
- var originalReminder = selectedReminders[0];
- var updatedReminder = reminderFox_cloneReminderFoxEvent(selectedReminders[0] );
-
- if ( updatedReminder.extraInfo == null ) {
- updatedReminder.extraInfo = "";
- }
- else {
- updatedReminder.extraInfo += "\\n";
- }
- //2008-12-16 clear trailing/leading spaces
- var organizerName = reminderFox_trim(organizer.split("<")[0]);
- var organizerMail = reminderFox_trim(organizer.split("<")[1]);
-
- if (organizerMail == null) {
- organizerMail = organizerName;
- organizerName ="";
- }
- if (organizerMail.charAt(organizerMail.length-1) == ">") {
- organizerMail = organizerMail.substring(0,organizerMail.length-1)
- }
- var xString ="ORGANIZER";
- if (organizerName != "") {xString += ";CN=" + organizerName}
- if (organizerMail != "") {xString += ":MAILTO:" + organizerMail}
-
- updatedReminder.extraInfo = updatedReminder.extraInfo + xString;
-
- // add SEQUENCE=1 and DTSTAMP (current date/time in 'Z'
- var currentDate = new Date();
- var tzOffset = new Date().getTimezoneOffset();
- currentDate.setMinutes( currentDate.getMinutes() + tzOffset );
-
- var dtStamp = reminderFox_getDateAsString(currentDate)+ "Z";
- updatedReminder.extraInfo += "\\nSEQUENCE:" + 1 +"\\nDTSTAMP:" + dtStamp;
-
- // add ATTENDEE(s)
- if (methodTyp == "REQUEST") {
- attendees = results.attendees.replace(/(^\s+)|(\s+$)/g, '');
-
- if ( updatedReminder.extraInfo == null ) {
- updatedReminder.extraInfo = "";
- } else {
- updatedReminder.extraInfo += "\\n";
- }
- // ATTENDEE;RSVP=TRUE:MAILTO:abcde@fghi.xx
- var attendeeArray = attendees.split(",");
- for ( var i = 0; i < attendeeArray.length; i++ ) {
- if (attendeeArray[i] == "") {break;}
- var attendeeMail ="";
- var attendeeName ="";
-
- var attendeeX = attendeeArray[i].split("<");
- if (attendeeX.length == 1) { // only mailAdr
- var attendeeMail = attendeeX[0].replace(/(^\s+)|(\s+$)/g, '').replace(">", '');
- } else { // mailName and adr
- var attendeeName = attendeeX[0].replace(/(^\s+)|(\s+$)/g, '');
- var attendeeMail = attendeeX[1].replace(/(^\s+)|(\s+$)/g, '').replace(">", '');
- }
- var xString ="ATTENDEE";
- if (attendeeName != "") {xString += ";CN=" + attendeeName}
- if (attendeeMail != "") {xString += ";RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:MAILTO:" + attendeeMail}
-
- if ( i != 0 ) {
- updatedReminder.extraInfo += "\\n";
- }
- updatedReminder.extraInfo = updatedReminder.extraInfo + xString;
- }
- }
-
- // add 'comment' from invitation.xul dialog
- if (results.schComment != "") {
- updatedReminder.extraInfo += "\\nCOMMENT:" + results.schComment;
- }
- // add other items
- reminderFox_processExtraScheduleInfo(updatedReminder, "", methodTyp );
-
- // add category
- var iCalCategory = reminderFox_getBundle().getString("rf.mail.ical.send.subject.invitation"); // "invitation";
- var iCalCategoryLC = iCalCategory.toLowerCase(); // "invitation";
- if ( updatedReminder.categories != null && updatedReminder.categories.length > 0 ) {
- if (updatedReminder.categories.toLowerCase().indexOf(iCalCategoryLC) == -1){
- updatedReminder.categories = updatedReminder.categories + ", " + iCalCategory;}
-
- } else { updatedReminder.categories = iCalCategory;
- }
-
- // REPLACE the current entry
- removeListItemsForReminder(originalReminder);
- // remove from model list
- var reminders = reminderFox_getReminderEvents();
- for( var i = 0; i < reminders.length; i++) {
- if ( reminders[i].id == originalReminder.id ) {
- reminderFox_removeElement(reminders, i);
- break;
- }
- }
-
- // add reminder in sorted order...
- reminders = reminderFox_getReminderEvents();
- if ( updatedReminder.remindUntilCompleted != REMINDERFOX_REMIND_UNTIL_COMPLETE_NONE ) {
- updatedReminder.remindUntilCompleted = REMINDERFOX_REMIND_UNTIL_COMPLETE_TO_BE_MARKED;
- }
- var sortedIndex = reminderFox_getSortedIndexOfNewReminder( reminders, updatedReminder, false );
- reminderFox_insertIntoArray( reminders, updatedReminder, sortedIndex );
-
- updatedReminder.snoozeTime = null;
- createListItem(updatedReminder);
-
- var currentDate = oeDatePicker.gSelectedDate;
- if ( currentDate == null ) {
- currentDate = new Date();
- }
-
- var newDate = new Date();
- if ( updatedReminder.alarm != null ) {
- updatedReminder.alarmLastAcknowledge = newDate.getTime();
- // if there's a snooze... and lastack > snooze, erase snooze...
- // this means... well it should be if date changed at all, then need to clear snooze...
- }
- updatedReminder.lastModified = reminderFox_getDateAsString(newDate );
- var reminder = reminderFox_processReminderDescription(updatedReminder, currentDate.getFullYear(), false);
- var modified = updateReminderInList( reminder );
- sortReminderIfNeccessary( updatedReminder.id);
-
- refreshCalendar();
- modifiedReminders();
-
- selectedReminders[0] = updatedReminder; // need array
- rmFx_sendEventNow(selectedReminders, "", methodTyp, organizer, attendees, selectedTyp);
- }
-
- /**
- * Preparing the message content and passing to the send or compose mail function
- *
- * @param reminderToBeSend passed as array!!
- * @param todosToBeSend passed as array!!
- * @param methodTyp 'PUBLISH' | 'REQUEST' | 'REPLY' | 'ICS' (for sending 'view')
- * @param fromAddress
- * @param attendees
- * @param selectedTyp 'invite' = send one event as invitation | 'info' = send one/more event
- * @return
- */
- function rmFx_sendEventNow(reminderToBeSend, todosToBeSend, methodTyp, fromAddress, attendees, selectedTyp) {
-
- var statusMsg = "";
- if ((fromAddress != "") && (fromAddress != null)) {
- statusMsg += reminderFox_getBundle().getString("rf.mail.ical.sendby")
- + " " + fromAddress;
- } else {
- statusMsg += reminderFox_getBundle().getString("rf.mail.ical.send") + " "; // "Sending"
- }
- statusMsg += " " + reminderFox_getBundle().getString("rf.mail.ical.sending");
- rmFxCore.statusSet (statusMsg);
-
- var footer = " " + "______________________________________________________\n"
- + reminderFox_getBundle().getString("rf.mail.ical.send.body");
-
- // --- setup parameters for message -----------------
- var eMailSubject ="";
-
- if (methodTyp == "ICS") {
- eMailSubject = "[ics] ";
- }
- if (methodTyp == "PUBLISH") {
- eMailSubject = "[iCal] " + methodTyp + ": "; // $$$locale iCal PUBLISH
- }
-
- if ((reminderToBeSend != null) && (reminderToBeSend != "")) {
- var uid = reminderToBeSend[0].id;
- var extraInfo = rmFx_extraInfoArray(reminderToBeSend[0]);
-
- if (selectedTyp == 'reminder') { methodTyp = "PUBLISH"; }
- var iCalString = reminderFox_constructReminderOutput( reminderToBeSend, "", true, true, methodTyp );
- }
-
- if ((todosToBeSend != null) && (todosToBeSend != "")) {
- var uid = todosToBeSend[0][0].id;
- var extraInfo = "";
- if (selectedTyp == 'todo') { methodTyp = "PUBLISH"; }
- var iCalString = reminderFox_constructReminderOutput( "", todosToBeSend, true, true, methodTyp );
- }
-
-
- if (methodTyp == 'REQUEST' ) {
- eMailSubject = "[iCal] " + methodTyp + ": "; //$$$locale iCal eg. REQUEST
- selectedTyp = 'invite';
- }
- if (methodTyp == 'REPLY') {
- eMailSubject = "[iCal] ";
- selectedTyp = 'invite';
-
- var xAtt =rmFx_extraInfoArray(reminderToBeSend[0]);
- var Item = "ATTENDEE";
- var attPart="";
- if (xAtt != null) {
- if (xAtt.length > -1) {
- for (var n =0; n < xAtt.length; n++) {
- if (xAtt[n].indexOf( Item ) == 0) {
- var fnd = xAtt[n].indexOf("PARTSTAT=");
- if (fnd != -1) {
- var attPart = xAtt[n].substring(fnd+9);
- fnd = attPart.indexOf(";");
- if (fnd == -1) {attPart.indexOf(":")};
- var attPart = attPart.substring(0,fnd);
- }
- }
- }
- }
- }
- eMailSubject += attPart + ": "; //$$$locale iCal eg. ACCEPTED / DECLINED
- }
-
- ////////////////// 'invite' was selected ////////////////////////////////////
- // sending without extra compose
- if (selectedTyp == 'invite') {
- eMailSubject += reminderToBeSend[0].summary
- + " / " + reminderFox_getBundle().getString("rf.schedule.statusOf")
- + " " + reminderFox_parseDateTimes(rmFx_extraInfo(extraInfo,"DTSTAMP"))
- + " [#" + rmFx_extraInfo(extraInfo,"SEQUENCE") +"]";
-
- var body = "*" + reminderFox_getBundle().getString("rf.mail.ical.send.subject.invitation")
- + "* »" + reminderToBeSend[0].summary + "«"
- + "\n" + reminderFox_getBundle().getString("rf.mail.ical.send.sentBy") + " " + fromAddress + "\n";
-
- // setup for different invitation items ....
- function addBody (option, optText) {
- return ((option == null) || (option == ""))
- ? ""
- : "\n" + optText + option;
- }
- var priority = reminderToBeSend[0].priority;
- var priorityStr = (priority == 1)
- ? reminderFox_getBundle().getString("rf.add.mail.message.priority")
- : "";
-
- body += addBody (priorityStr, "*" + reminderFox_getBundle().getString("rf.add.mail.message.priority.label")+ "* ");
- body += addBody (reminderToBeSend[0].location, "*" + reminderFox_getBundle().getString("rf.mail.ical.send.location") + "* ");
- body += addBody (reminderToBeSend[0].url, "*" + reminderFox_getBundle().getString("rf.add.reminders.tooltip.url") + "* ");
- body += addBody (reminderToBeSend[0].notes, "\n*" + reminderFox_getBundle().getString("rf.add.mail.message.notes")
- +"* ___________________________ \n");
-
- /** ---------- sending without extra compose --------------------------**/
- var tmpMsgFile = rmFxMsg.FileCreate(
- eMailSubject,
- fromAddress,
- attendees,
- priority,
- body,
- footer,
- uid,
- iCalString, methodTyp);
-
- rmFxMsg.FileSend (eMailSubject,
- fromAddress,
- attendees,
- priority,
- tmpMsgFile,
- uid);
-
- rmFxCore.statusSet (reminderFox_getBundle().getString("rf.mail.ical.sendby") + " " + fromAddress); // "Send by"
- return;
- }
-
- /* ---------- not used ???? ------------------------------------------------
- ////////////////// 'info' was selected ////////////////////////////////////
- // sending one or more reminders, go for compose
-
- if (selectedTyp == 'info') { // used with 'SendAsItIs' and 'multiple' events
- // ** differentiate: one event:: just take the summary as subject
- // ** no ATTENDEES (toAddress) ... have to add with 'composemessage'
-
- var body = reminderFox_getBundle().getString("rf.add.mail.message.body");
-
- if (reminderToBeSend.length == 1) {
- eMailSubject += reminderToBeSend[0].summary;
-
- body += ": " + eMailSubject
- + "\n" + reminderFox_getBundle().getString("rf.mail.ical.send.sentBy") + " " + fromAddress
- + "\n" + reminderFox_getBundle().getString("rf.add.mail.message.subject")
- + "\n\n";
-
- } else { // more than one events:: only give # of events
- eMailSubject += reminderFox_getBundle().getString("rf.schedule.event.send")
- + " (" + reminderToBeSend.length +")";
-
- body += "\n\n" + reminderFox_getBundle().getString("rf.mail.ical.send.sentBy") + " " + fromAddress +"\n";
- }
- // ---------- compose ------------------------------------------------
- var iCalFile = reminderFox_getReminderStoreFile();
- iCalFile.leafName = "reminderfoxEvents.ics";
-
-
- // rmFxUtil.dump2Console ("gWTEST: 'info' msg Compose iCalToEmailFile >>" +iCalFile.path+ "<<"); //gWTEST darwin
-
-
- var iCalToEmailFile = rmFxUtil.makeMsgFile (rmFxUtil.encodeUTF8(iCalString), iCalFile.path);
-
- if (iCalToEmailFile == null) {
- rmFxUtil.PromptAlert("Compose failed. File '" + iCalFile.path + "' path not valid!");
- return;
- }
- rmFxMsg.Compose(eMailSubject, fromAddress, attendees,
- priority, body, footer, uid, iCalToEmailFile, methodTyp);
-
-
- rmFxCore.statusSet (reminderFox_getBundle().getString("rf.add.mail.message.compose")) / *"Compose message"* /
- + " (" + fromAddress + ")";
- return;
- }
- --------- not used ?? --------------*/
-
- /////////// 'reminder' or 'todo' has been selected /////////////
- // go for compose
- // one event: just take the reminder.summary as 'subject'
- // no ATTENDEES (toAddress) ... have to add with 'composemessage'
-
- // prepare 'body' and 'subject' of message
-
- var body = reminderFox_getBundle().getString("rf.add.mail.message.body") + "\n";
-
- if ((fromAddress != "") && (fromAddress != null)) {
- body += reminderFox_getBundle().getString("rf.mail.ical.send.sentBy")
- + " " + fromAddress +"\n";
- }
-
- var _subject = "";
- if (selectedTyp == 'todo') {
- if (todosToBeSend[0].length == 0) {
- statusMsg = reminderFox_getBundle().getString("rf.mail.ical.noitems");
- rmFxCore.statusSet (statusMsg);
- return; // no todo's selected
- }
- if (todosToBeSend[0].length == 1) {
- _subject = todosToBeSend[0][0].summary
- } else {
- _subject = todosToBeSend[0].length;
- }
- }
- if (selectedTyp == 'reminder') {
- if (reminderToBeSend.length == 0) {
- statusMsg = reminderFox_getBundle().getString("rf.mail.ical.noitems"); //"No items to be send."
- rmFxCore.statusSet (statusMsg);
- return;} // no events selected
- if (reminderToBeSend.length == 1) {
- _subject = reminderToBeSend[0].summary
- } else {
- _subject = reminderToBeSend.length;
- }
- }
- var msgInfo = reminderFox_getBundle().getString("rf.schedule.event.send." + selectedTyp)
- + " : " + _subject;
-
- // var viewLabel;
- // (rmFxViewLabel != "")
- // ? viewLabel=(" [" + reminderFox_getBundle().getString("rf.views.name") + ": " + rmFxViewLabel + "] : ")
- // : viewLabel=(" : ");
- // body += selectedTyp.toUpperCase() + viewLabel + _subject + "\n\n";
- body += msgInfo + "\n\n";
-
- eMailSubject += msgInfo;
-
-
- // ---------- compose ------------------------------------------------
- var iCalFile = reminderFox_getReminderStoreFile();
- iCalFile.leafName = "reminderfoxEvents.ics";
-
- // rmFxUtil.dump2Console ("gWTEST: msg Compose iCalToEmailFile >>" +iCalFile.path+ "<<"); //gWTEST darwin
-
- var iCalToEmailFile = rmFxUtil.makeMsgFile (rmFxUtil.encodeUTF8(iCalString), iCalFile.path);
- if (iCalToEmailFile == null) {
- rmFxUtil.PromptAlert("Compose failed. File '" + iCalFile.path + "' path not valid!");
- return;
- }
-
- rmFxMsg.Compose(eMailSubject, fromAddress, attendees,
- priority, body, footer, uid, iCalToEmailFile, methodTyp);
-
- rmFxCore.statusSet (reminderFox_getBundle().getString("rf.add.mail.message.compose")) /*"Compose message"*/
- }
-
- function reminderFox_parseDateTimes(stringDT) { /* 20051208T224616 or 20051208T224616Z = UTC */
- var thisDate = reminderFox_getStringAsDate(stringDT);
-
- var timeString = reminderFox_mail_getTimeString( thisDate );
- var dateVariableString;
- try {
- dateVariableString = reminderFox_getUnicodePref(REMINDER_FOX_PREF + "." + REMINDER_FOX_LIST_DATE_LABEL);
- } catch(e) {
- }
- var remFoxDate =reminderFox_getDateVariable( null, thisDate, dateVariableString ) + " " + timeString;
- return remFoxDate;
-
- return stringDT;
- }
-
- function rmFx_extraInfoArray(reminder){
- /* ------ converts the extraInfo string to an array
- */
- if (!!reminder.extraInfo) {
- var extraInfoArray = reminder.extraInfo.split("\\n");
- return extraInfoArray;
- } else {
- return null;
- }
- }
-
-
- function rmFx_extraInfo(extraInfos, item, delimiter, multiple){ // if multiple==true --> build array
- // ------ reads from extraInfos array using item
- if (delimiter == null) delimiter = ":";
- var Item = item.toUpperCase();
- var result="";
- if (extraInfos != null) {
- if (extraInfos.length > -1) {
- for (var n =0; n < extraInfos.length; n++) {
- if (extraInfos[n].indexOf( Item ) == 0) {
- if (multiple) {result += extraInfos[n].substring(extraInfos[n].indexOf( delimiter ) +1 ) + "\n";
- } else {
- result = extraInfos[n].substring(extraInfos[n].indexOf( delimiter ) +1);
- break;
- }
- }
- }
- }
- }
- return result;
- }
-
-
- //============================================================
-
- // -------- select Attendee from menu -----------------
-
- function rmFx_replyAttDialogClose() {
- window.arguments[0].attendeeNo =
- document.getElementById('rmFx_replyAttendeeGroup').selectedIndex;
- }
- function rmFx_replyAttDialogCancel() {
- window.arguments[0].attendeeNo = -1;
- }
-
- function rmFx_replyAttendeeAdd() {
- var attendeesList = window.arguments[0].attendees;
- var attGroup = document.getElementById("rmFx_replyAttendeeGroup");
- for ( var i = 0; i < attendeesList.length; i++ ) {
-
- var fndIndex = attendeesList[i].toUpperCase().lastIndexOf( "MAILTO:" );
- if (fndIndex != -1) {
- var fndString = attendeesList[i].substring( fndIndex + 7);
-
- var e = document.createElement("radio");
- e.setAttribute("group", "rmFx_replyAttendeeGroup");
- e.setAttribute("label", fndString);
- attGroup.appendChild(e);
- }
- }
- }
-
- // ---- setup 'mail-app' and 'myAccounts' ---- (for FX) ----
- function rmFx_mailAppSetup() {
-
- var results = { organizer: null,
- attendees: null,
- mode: 'mailApp',
- selectedTyp: 'info',
- schComment: ''};
- window.openDialog("chrome://reminderfox/content/mail/invitation.xul",
- "reminderFox-set-invitationmailAppString", "chrome,resizable,modal", results);
-
- if (results.mode == 'CANCEL') { return 'CANCEL';} // user pressed 'CANCEL'
-
- return reminderFox_prefsBranch
- .getCharPref(REMINDER_FOX_MAIL_SENDER);
- }
-
- // ---- setup 'mail-app' and 'myAccounts' ---- (for FX) ----
- function rmFx_sendExportDialog() {
-
- var results = { organizer: null,
- attendees: null,
- mode: 'mailApp',
- selectedTyp: 'info',
- schComment: ''};
- window.openDialog("chrome://reminderfox/content/mail/invitation.xul",
- "reminderFox-set-invitationmailAppString", "chrome,resizable,modal", results);
-
- if (results.mode == 'CANCEL') { return 'CANCEL';} // user pressed 'CANCEL'
-
- return results;
- }
-
- // ---- invitation XUL dialogs -------------
-
- function rmFx_invitationLoadDialog() {
-
- if (window.arguments[0].mode == "mailApp") {
- this.title = reminderFox_getBundle().getString("rf.schedule.setDefaults");
- }
-
- var orgMenu= document.getElementById('organizerMenu');
-
- // with rmFxMsg.myMailIDs the mailIdentities/organizer
- // and the mailApplication location are checked and read
- var myAccount = rmFxMsg.myMailIDs();
-
- if (!!myAccount) {
- var myAccounts = myAccount.split(",");
- for (var i = 0; i < myAccounts.length; i++) {
- var myAccount = myAccounts[i];
- var menuitem = orgMenu.appendItem(myAccount, i);
- }
- orgMenu.selectedIndex = 0;
- }
-
- // with TB/SM the pulldown menu is NOT editable !!!
- if (rmFxMsg.messenger()) {
- document.getElementById('organizerMenu').removeAttribute( "editable");
-
- // document.getElementById('reminderFox-mailApp.Location-Box') /* //gWTEST DARWIN do not hide for testing */
- // .setAttribute( "hidden", true);
- }
-
- try {
- var rmFx_exportFile = reminderFox_prefsBranch.getCharPref("exportEventsFile");
- } catch (ex) {rmFx_exportFile = "reminderfoxEvents.ics";}
-
- document.getElementById("exportFile").setAttribute ("value", rmFx_exportFile);
-
-
- if (window.arguments[0].reminderTyp == 'reminder') {
- document.title = document.title
- + " : " + reminderFox_getBundle().getString("rf.html.heading.reminders") /*Reminders*/
- + " (" + window.arguments[0].eventLength + ") "; /*Todo's*/
- } else {
- document.title = document.title
- + " : " + reminderFox_getBundle().getString("rf.html.heading.todos")
- + " (" + window.arguments[0].eventLength + ") ";
- }
-
- rmFx_invitationSwitch(); // setting to 'Export'
- }
-
-
- function rmFx_invitationCloseDialog(mode) { // mode = CANCEL or OK
-
- if (mode == 'CANCEL') {
- window.arguments[0].mode = mode;
- return;
- }
-
- if (document.getElementById('sendSection').checked) {
-
- window.arguments[0].mode = 'xSend';
-
- var organizer = document.getElementById('organizerMenu').label;
-
- if ((organizer == "") && (organizer.indexOf('<') == -1) && (organizer.indexOf('>') == -1)) {
- organizer = "<" + organizer + ">";
- }
- window.arguments[0].organizer = organizer;
-
- reminderFox_prefsBranch.setCharPref(REMINDER_FOX_MAIL_SENDER, organizer);
-
- if (document.getElementById('inviteEnable').checked == true) {
- window.arguments[0].selectedTyp = 'invite';
- window.arguments[0].attendees = document.getElementById('attendees').value;
- } else {
- window.arguments[0].selectedTyp = 'info';
- window.arguments[0].attendees = "";
- }
-
- if ( document.getElementById('commentText').value != "") {
- window.arguments[0].schComment = document.getElementById('commentText').value;
- }else {
- window.arguments[0].schComment = "";
- }
-
- var mailApp = document.getElementById('mailApp.location.input').value
- reminderFox_prefsBranch.setCharPref(REMINDER_FOX_MAIL_PATH, mailApp);
- }
-
- if (document.getElementById('exportSection').checked) {
-
- window.arguments[0].mode = 'xExport';
- window.arguments[0].selectedTyp = 'info';
-
- var exportFile = document.getElementById('exportFile').value;
-
- var prefsName = "exportEventsFile" // set as prefs 'extensions.reminderFox.exportEventsFile'
- reminderFox_prefsBranch.setCharPref(prefsName, exportFile);
- }
- }
-
- function rmFx_invitationSwitch() {
-
- if (window.arguments[0].selectedTyp == 'info') {
-
- document.getElementById('reminderFox-invitationGroup')
- .setAttribute( "hidden", true );
- document.getElementById('reminderFox-commentGroup')
- .setAttribute( "hidden", true );
- sizeToContent();
-
- rmFx_sendExportChange("exportSection");
- return;
- }
-
- if ( document.getElementById('inviteEnable').checked == true ) {
- document.getElementById('reminderFox-commentGroup')
- .setAttribute( "hidden", false );
- document.getElementById('reminderFox-attendeeGroup')
- .setAttribute( "hidden", false );
- }
-
- if ( document.getElementById('inviteEnable').checked == false ) {
- document.getElementById('reminderFox-commentGroup')
- .setAttribute( "hidden", true );
- document.getElementById('reminderFox-attendeeGroup')
- .setAttribute( "hidden", true );
- }
-
- sizeToContent();
- }
-
-
- // --------- functions for TB,SM ... and 'non' mail (like FX) ---------
-
- /*
- Firefox {ec8030f7-c20a-464f-9b0e-13a3a9e97384}
- Thunderbird {3550f703-e582-4d05-9a08-453d09bdfdc6}
- Nvu {136c295a-4a5a-41cf-bf24-5cee526720d5}
- Mozilla Suite {86c18b42-e466-45a9-ae7a-9b95ba6f5640}
- SeaMonkey {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}
- Sunbird {718e30fb-e89b-41dd-9da7-e25a45638b28}
- Netscape Browser {3db10fab-e461-4c80-8b97-957ad5f8ea47}
- Flock Browser {a463f10c-3994-11da-9945-000d60ca027b}
- */
-
- /**
- * get the messenger apps location
- * first check prefs if already set
- *
- */
- function rmFx_MessengerApp(){
- //------------------------------------------------------------------------------
- var fileValid = true;
- var mFile = null;
- var mailApp = "";
-
- var mFileServ = Components.classes["@mozilla.org/file/directory_service;1"]
- .getService(Components.interfaces.nsIProperties);
-
- var file = Components.classes["@mozilla.org/file/local;1"]
- .createInstance(Components.interfaces.nsILocalFile);
- // sets the default location for messenger app
- var appNameX =Components.classes["@mozilla.org/xre/app-info;1"];
- var appName = appNameX.getService(Components.interfaces.nsIXULAppInfo).name;
- var appID = appNameX.getService(Components.interfaces.nsIXULAppInfo).ID;
-
- var osInfo = rmFx_opSystemInfo();
-
- if (rmFx_isMessenger()) {
- mFile = mFileServ.get("CurProcD", Components.interfaces.nsIFile);
-
- if (osInfo.indexOf("WINNT") != -1) {
- mFile.append(appName + ".exe");
- }
- if(osInfo.indexOf("Linux") != -1) {
- mFile.append(appName.toLowerCase());
- }
- if(osInfo.indexOf("Darwin") != -1) {
- var mFile = mFileServ.get("LocApp", Components.interfaces.nsIFile);
- mFile.append(appName + ".app");
- }
- }
-
- try {
- var mailApp = reminderFox_prefsBranch.getCharPref(REMINDER_FOX_MAIL_PATH );
- } catch (ex) {}
-
-
- try {
- file.initWithPath(mailApp);
- fileValid = file.exists();
- } catch ( e ) {
- fileValid = false;
- }
-
- if ((fileValid == false) && (mFile != null)) {
- mailApp = mFile.path;
- file.initWithPath(mailApp);
- fileValid = true;
- }
-
- if (fileValid == false) { // mailApp / OS not valid, ask user
-
- //gW appPicker 2009-10-03 +++2do change for application menu (see FX --> Options --> Applications)
-
- var fp = Components.classes["@mozilla.org/filepicker;1"]
- .createInstance(Components.interfaces.nsIFilePicker);
- var winTitle = "Select Mail/Messenger Application" // this._prefsBundle.getString("fpTitleChooseApp");
- fp.init(window, winTitle, Components.interfaces.nsIFilePicker.modeOpen);
- fp.appendFilters(Components.interfaces.nsIFilePicker.filterApps);
-
- // Prompt the user to pick an app. If they pick one, and it's a valid
- // selection, then set it for 'mailto' / 'messenger'
-
- if (fp.show() == Components.interfaces.nsIFilePicker.returnOK
- && fp.file && rmFxUtil.isValidHandlerExecutable(fp.file))
- {
- var handlerApp =rmFxUtil.getLocalHandlerApp(fp.file);
-
- } else {
- reminderFox_prefsBranch.setCharPref(REMINDER_FOX_MAIL_PATH, "");
-
- return ""; // return file object
- }
-
- var mailApp = fp.file.path;
- reminderFox_prefsBranch.setCharPref(REMINDER_FOX_MAIL_PATH, mailApp);
-
- file.initWithPath(mailApp);
- }
-
-
- if(osInfo.indexOf("Darwin") != -1) {
-
- if (mailApp.toLowerCase().indexOf("-bin") == -1) {
- file.initWithPath(mailApp);
-
- file.append("Contents");
- file.append("MacOS");
-
- if (mailApp.toLowerCase().indexOf("thunderbird") != -1) file.append("thunderbird-bin");
- if (mailApp.toLowerCase().indexOf("seamonkey") != -1) file.append("seamonkey-bin");
- if (mailApp.toLowerCase().indexOf("postbox") != -1) file.append("postbox-bin");
- fileValid = true;
- }
- }
-
- reminderFox_prefsBranch.setCharPref(REMINDER_FOX_MAIL_PATH, mailApp);
- return file; // return file object
- }
-
-
- // ------------ "Browse" for 'mail app' path -------------------
-
- function rmFx_mailAppStringBrowse() {
-
- reminderFox_prefsBranch.setCharPref (REMINDER_FOX_MAIL_PATH, "");
- document.getElementById('mailApp.location.input').value = rmFx_MessengerApp().path;
- }
-
-
- // -------------- open 'mail' addressbook ------------------
-
- function rmFx_abookOpen() {
-
- // first enable textbox for easy pasting
- document.getElementById('attendees').removeAttribute( "disabled");
- document.getElementById('inviteEnable').setAttribute( "checked","true");
-
- const nsIWindowMediator = Components.interfaces.nsIWindowMediator;
- var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
- var windowManagerInterface = windowManager.QueryInterface(nsIWindowMediator);
-
- var inType = "mail:addressbook";
- var topWindow = windowManagerInterface.getMostRecentWindow( inType );
-
- if ( topWindow ) { // if already open bring it to front
- topWindow.focus();
- } else {
-
- var osInfo = rmFx_opSystemInfo();
- var mailApp = rmFx_MessengerApp();
- if ((mailApp == null) || (mailApp == "")) {
- rmFxUtil.PromptAlert("Messenger not found!"); // reminderFox_getBundle().getString("rf.schedule. $$string$$ "));
- return;
- }
- try {
- go4Process.init(mailApp);
- } catch (ex) {}
- go4Process.run(false, new Array( "-addressbook"), 1);
- }
- }
-
- function rmFx_abookMini() {
- var inType = "mail:addressbook";
-
- const nsIWindowMediator = Components.interfaces.nsIWindowMediator;
- var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
- var windowManagerInterface = windowManager.QueryInterface(nsIWindowMediator);
- var topWindow = windowManagerInterface.getMostRecentWindow( inType );
-
- topWindow.minimize();
- }
-
- function rmFx_insertAttendees(xAttendees) {
- // focus on the 'invitation' window
- var inType = "window:ItemDialog";
-
- const nsIWindowMediator = Components.interfaces.nsIWindowMediator;
- var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
- var windowManagerInterface = windowManager.QueryInterface(nsIWindowMediator);
- var topWindow = windowManagerInterface.getMostRecentWindow( inType );
-
- try {
- topWindow.focus();
- var attendeeBox = topWindow.document.getElementById("attendees");
- var attendeeText = attendeeBox.value;
- var end0 = attendeeBox.selectionEnd;
-
- if (attendeeText == "" && attendeeText != null){
- attendeeBox.value = xAttendees;
- }
- else {
- if (attendeeText.charAt(attendeeText.length) != ',') {
- attendeeBox.value = attendeeText + ',' + xAttendees;
- } else {
- attendeeBox.value = attendeeText + xAttendees;
- }
- }
- var end = attendeeBox.textLength;
- attendeeBox.setSelectionRange(end);
- topWindow.focus();
- } catch (e) {}
- }
-
- /////////////////////// iCalUtil ///////////////////////////////////////////////
-
- function iCalUtil () {
- }
-
- // icsString ORGANIZER;CN=name:MAILTO:mailadr@abc.xx
- // returns: name<mailadr@abc.xx>
- iCalUtil.getMailAddress = function (icsString) {
- var persName="";
- var persMail="";
- var fndIndex = icsString.toUpperCase().lastIndexOf( "MAILTO:");
- if (fndIndex != -1) {
- persMail = icsString.substring( fndIndex + 7);
- } else {
- var colnIndex = icsString.lastIndexOf(":");
- if (colnIndex != -1) {
- if (icsString.substring( colnIndex).indexOf("@") != -1) {
- persMail = icsString.substring( colnIndex + 1); }
- }
- }
- var fndIndex = icsString.toUpperCase().indexOf( "CN=" );
- if (fndIndex != -1) {
- var fndString = icsString.substring( fndIndex + 3);
- var colnIndex = fndString.indexOf(":");
- var semkiIndex = fndString.indexOf(";");
-
- if ((semkiIndex != -1) && (semkiIndex < colnIndex)) {
- persName = fndString.substring( 0, semkiIndex);
- } else { persName = fndString.substring( 0, colnIndex); }
- }
-
- if (persName == "") {return '<' + persMail +'>';
- } else {
- return persName + '<' + persMail +'>';
- }
- }
-
-
- // http://tools.ietf.org/html/rfc2446#section-3.2.2.1 Rescheduling an Event
- function rmFx_iCalReschedule(originalReminder, currentReminder) {
- // ---------------------------------------------------------------
- if (originalReminder.extraInfo == null) return;
-
- var extraInfoOrginal = rmFx_extraInfoArray (originalReminder);
- var extraInfoCurrent = rmFx_extraInfoArray (currentReminder);
-
- var currentATT = rmFx_extraInfo( extraInfoOrginal,"ATTENDEE");
- if (currentATT == null || currentATT.length == 0) { return;}
- // OK it's a Invitation/Schedule .. rescheduling requirements:
- // 1. is the ORGANIZER one of my accounts? Maybe hard with FX!!
- // 2. A rescheduled event involves time or recurrence intervals
- // and possibly the location or description
-
- // ad 1. check ORGANIZER
- // currentORG = "ORGANIZER;CN=name:MAILTO:mailadr@abc.xx"
- // myAccounts = "name<mailadr@xyz.xx>,name2<mailadr2@mmm.zz>"
-
- var currentORG = rmFx_extraInfo( extraInfoOrginal,"ORGANIZER", ";");
-
- if (currentORG.length == 0) { return;} // no ORGANIZER
- var fndIndex = currentORG.toUpperCase().lastIndexOf( "MAILTO:" );
-
- var aa= rmFxMsg.myMailIDs();
-
- if (aa.toUpperCase().indexOf(currentORG
- // if (rmFxMsg.myMailIDs().toUpperCase().indexOf(currentORG
- .substring( fndIndex + 7).toUpperCase()) == -1 ) {return;} // no ORGANIZER -- no Invitation/Schedule
- // ORGANIZER ok
-
- var fromAddress = iCalUtil.getMailAddress(currentORG);
-
- // ad 2. check if parameters changed
-
- if (currentReminder.endDate == null && originalReminder.endDate != null) {
- currentReminder.endDate = originalReminder.endDate;
- }
-
- var dateChange = originalReminder.date.toGMTString()
- != currentReminder.date.toGMTString()
- || originalReminder.endDate.toGMTString()
- != currentReminder.endDate.toGMTString();
- var recurChange = (
- originalReminder.recurrence.byDay != currentReminder.recurrence.byDay
- || originalReminder.recurrence.endDate != currentReminder.recurrence.endDate
- || originalReminder.recurrence.interval != currentReminder.recurrence.interval
- || originalReminder.recurrence.type != currentReminder.recurrence.type);
-
- var sumChange = originalReminder.summary != currentReminder.summary;
-
- var locChange = originalReminder.location != currentReminder.location;
-
- if ( !(dateChange || recurChange || sumChange|| locChange ) ) {return;} // no Change
-
- // ORGANIZER 'rescheduled' the event
- // read ORGANIZER from reminder and set it to 'fromAddress'
- // read ATTENDEE(s) from reminder and set it to 'attendees'
- // parameter to be updated:
- // - DTSTAMP
- // - SEQUENCE
- // - SUMMARY/DESCRIPTION
- // - LASTMODIFIED ????
-
-
- var aExtraInfo = rmFx_extraInfoArray(currentReminder);
-
- // for ATTENDEE(s) have to build the to=mailString and all ATT need to called RSVP!!
-
- var attendeeString =""; // for iCal ATTENDEE:
- var attendees =""; // for mail compose to=
-
- for (var i=0; i< aExtraInfo.length; i++) {
- if (aExtraInfo[i].indexOf("ATTENDEE") == 0) {
-
- var attendeeName="";
- var attendeeMail="";
- var fndIndex = aExtraInfo[i].toUpperCase().lastIndexOf( "MAILTO:");
- if (fndIndex != -1) {
- attendeeMail = aExtraInfo[i].substring( fndIndex + 7);
- } else {
- var colnIndex = aExtraInfo[i].lastIndexOf(":");
- if (colnIndex != -1) {
- if (aExtraInfo[i].substring( colnIndex).indexOf("@") != -1) {
- attendeeMail = aExtraInfo[i].substring( colnIndex + 1); }
- }
- }
- var fndIndex = aExtraInfo[i].toUpperCase().indexOf( "CN=" );
- if (fndIndex != -1) {
- var fndString = aExtraInfo[i].substring( fndIndex + 3);
- var colnIndex = fndString.indexOf(":");
- var semkiIndex = fndString.indexOf(";");
-
- if ((semkiIndex != -1) && (semkiIndex < colnIndex)) {
- attendeeName = fndString.substring( 0, semkiIndex);
- } else {attendeeName = fndString.substring( 0, colnIndex); }
- }
- if (attendeeName == "") {attendees += '<' + attendeeMail +'>,';
- } else {
- attendees += attendeeName + '<' + attendeeMail +'>,';
- }
-
- var attendeeString ="ATTENDEE";
- if (attendeeName != "") {attendeeString += ";CN=" + attendeeName}
- if (attendeeMail != "") {attendeeString += ";RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:MAILTO:" + attendeeMail}
- aExtraInfo[i] = attendeeString;
- }
- }
- rmFx_extraInfoReplace (aExtraInfo, "SEQUENCE", rmFx_extraInfo(aExtraInfo, "SEQUENCE")*1 + 1);
- rmFx_extraInfoReplace (aExtraInfo, "DTSTAMP", rmFx_setDateTimeZ());
- rmFx_extraInfoReplace (aExtraInfo, "COMMENT", ""); // erase old
-
- currentReminder.extraInfo = aExtraInfo.join("\\n");
- // delete double 'CR'
- currentReminder.extraInfo = currentReminder.extraInfo.replace(new RegExp(/\\n\\n/g),"\\n");
-
- var chText = (dateChange ? " '" + reminderFox_getBundle().getString("rf.add.mail.message.datetime") + "' " : "") // "Date/Time")
- + (recurChange ? " '" + reminderFox_getBundle().getString("rf.add.mail.message.reccurance") + "' " : "") // "Recurrance")
- + (sumChange ? " '" + reminderFox_getBundle().getString("rf.schedule.description") + "' " : "") // "Title")
- + (locChange ? " '" + reminderFox_getBundle().getString("rf.mail.ical.send.location") + "' " : ""); // "Location");
-
- var methodTyp = "REQUEST";
- var newNotes = "[iCal] " + methodTyp + ": " + reminderFox_getBundle().getString("rf.schedule.statusOf")
- + ": " + reminderFox_parseDateTimes(rmFx_extraInfo(aExtraInfo,"DTSTAMP"))
- + " [#" + rmFx_extraInfo(aExtraInfo,"SEQUENCE") +"]\n"
- + "*" + reminderFox_getBundle().getString("rf.schedule.statusChanged")+"* " + chText +"\n\n";
- currentReminder.notes = newNotes + currentReminder.notes
- var reminders = new Array();
- reminders[0] = currentReminder;
- var iCalInvite = true;
- rmFx_sendEventNow(reminders, "", methodTyp, fromAddress, attendees, iCalInvite);
- }
-
- function rmFx_inviteStatus(currentReminder) {
- // --------------------------------------------
- // var extraInfoOrginal = rmFx_extraInfoArray (currentReminder);
-
- var currentORG = rmFx_extraInfo( rmFx_extraInfoArray (currentReminder),"ORGANIZER");
- if (currentORG.length == 0) { return;} // no ORGANIZER
-
- var fndIndex = currentORG.toUpperCase().lastIndexOf( "MAILTO:" );
- if (rmFxMsg.myMailIDs().toUpperCase()
- .indexOf(currentORG.substring( fndIndex + 7).toUpperCase()) == -1) {
-
- document.getElementById("newReminderText").setAttribute("disabled", "true");
-
- document.getElementById("reminderFox-all-day").setAttribute("disabled", "true");
-
- document.getElementById("reminderFox-timeList").setAttribute("disabled", "true");
- document.getElementById("yearlist").setAttribute("disabled", "true");
- document.getElementById("monthlist").setAttribute("disabled", "true");
- document.getElementById("daylist").setAttribute("disabled", "true");
-
- document.getElementById("reminderFox-endTimeList").setAttribute("disabled", "true");
- document.getElementById("endyearlist").setAttribute("disabled", "true");
- document.getElementById("endmonthlist").setAttribute("disabled", "true");
- document.getElementById("enddaylist").setAttribute("disabled", "true");
-
- document.getElementById("datepickerToggle").setAttribute("disabled", "true");
- document.getElementById("datepickerEndToggle").setAttribute("disabled", "true");
-
- document.getElementById("location").setAttribute("disabled", "true");
- document.getElementById("reminderFox-repeat").setAttribute("disabled", "true");
- }
- }
-
- function rmFx_extraInfoReplace (extraInfo, itemName, itemValue) {
- // ------ writes to aExtraInfo array using item
- itemName = itemName.toUpperCase();
- var result="";
- if (extraInfo != null) {
- if (extraInfo.length > -1) {
- for (var n =0; n < extraInfo.length; n++) {
- if (extraInfo[n].indexOf( itemName ) == 0) {
- if (itemValue == "") {
- extraInfo[n] ="";
- break;
- }
- extraInfo[n] = itemName + ":" + itemValue;
- break
- }
- }
- }
- }
- }
-
- function rmFx_setDateTimeZ() {
- var currentDate = new Date();
- var tzOffset = new Date().getTimezoneOffset();
- currentDate.setMinutes( currentDate.getMinutes() + tzOffset );
-
- return reminderFox_getDateAsString(currentDate)+ "Z";
- }
-
-
-
-
-
- /**
- //gWTEST rmFx_iCalTest TEST TEST TEST TEST TEST TEST
- <br> test purpose only: copy a BEGIN:CALENDAR ... END:CALENDAR
- <br> to clipboard and call this function to process /simulate
- <br> an 'iCal import form email'
- */
- function rmFx_iCalTest (){
- var clip = Components.classes["@mozilla.org/widget/clipboard;1"].
- getService(Components.interfaces.nsIClipboard);
- if (!clip) return false;
-
- var trans = Components.classes["@mozilla.org/widget/transferable;1"].
- createInstance(Components.interfaces.nsITransferable);
- if (!trans) return false;
- trans.addDataFlavor("text/unicode");
-
- clip.getData(trans,clip.kGlobalClipboard);
- var str = new Object();
- var strLength = new Object();
- trans.getTransferData("text/unicode",str,strLength);
-
- if (str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
- if (str) pastetext = str.data.substring(0,strLength.value / 2);
-
- var mInvitation = "[iCal] Schedule copied from Clipboard";
- this.reminderfox_Method ="CLIPBOARD";
-
- rmFx_iCalTagging(rmFxGetiCalFromTextBody(pastetext, mInvitation));
- return true;
- }
-
-
- /**
- * Change Groupbox elements for 'Export' and 'Send' dialogs
- *
- */
- function rmFx_sendExportChange(mode) {
- var sendOp;
-
- if (mode.id == "exportSection") sendOp = !mode.checked;
- if (mode.id == "sendSection") sendOp = mode.checked;
-
- // called from ... send Invitation as 'info' see: rmFx_invitationLoadDialog
- if (mode == "sendSection") sendOp = true;
-
- if (sendOp) {
- /* --- 'Export' --> disabled */
- document.getElementById("exportSection").setAttribute("checked", "false");
- document.getElementById("exportFile").setAttribute("disabled", "true");
- document.getElementById("getFileLocationButton").setAttribute("disabled", "true");
-
- /* --- 'Send' --> enabled */
- document.getElementById("sendSection").setAttribute("checked", "true");
-
- document.getElementById('mailApp.Description') .setAttribute( "class", "textNormal" );
- document.getElementById('mailApp.location.input').setAttribute( "class", "textNormal" );
-
- document.getElementById("organizerMenu").removeAttribute("disabled");
- document.getElementById("inviteEnable").removeAttribute("disabled");
-
- if (document.getElementById('inviteEnable').checked == true){
- document.getElementById('reminderFox-attendeeGroup').setAttribute( "hidden", false );
- document.getElementById('reminderFox-commentGroup').setAttribute( "hidden", false );
- }
- document.getElementById('attendees').removeAttribute( "disabled");
- document.getElementById('commentText').removeAttribute( "disabled");
- document.getElementById("mailAppButton").removeAttribute("disabled");
-
- // check the messenger to be used
- document.getElementById('mailApp.location.input').value = rmFx_MessengerApp().path;
-
- } else {
- /* --- 'Export' --> enabled */
- document.getElementById("exportSection").setAttribute("checked", "true");
- document.getElementById("exportFile").removeAttribute("disabled");
- document.getElementById("getFileLocationButton").removeAttribute("disabled");
-
- /* --- 'Send' --> disabled */
- document.getElementById("sendSection").setAttribute("checked", "false");
-
- document.getElementById('mailApp.Description') .setAttribute( "class", "textDisabled" );
- document.getElementById('mailApp.location.input').setAttribute( "class", "textDisabled" );
-
- document.getElementById("organizerMenu").setAttribute("disabled", "true");
- document.getElementById("inviteEnable").setAttribute("disabled","true");
-
- document.getElementById('reminderFox-attendeeGroup').setAttribute( "hidden", true );
- document.getElementById('reminderFox-commentGroup').setAttribute( "hidden", true );
-
- document.getElementById("mailAppButton").setAttribute("disabled", "true");
- }
- sizeToContent();
- }
-
- /**
- * Set the file for 'export' of reminders/todos
- * .. and set prefs for it
- *
- */
- function rmFx_getExportFile () {
-
- var currentFileName = document.getElementById("exportFile").value;
- var windowText = reminderFox_getBundle().getString("rf.export.send.title"); // "Set / Select file to export reminder(s)";
- var filterName = "Event File (ICS)";
- var defaultExtension = "ICS";
- var rmFx_exportFile = "exportEventsFile" // set as prefs 'extensions.reminderFox.exportEventsFile'
-
- var file = rmFx_filePicker (windowText, filterName, defaultExtension,
- currentFileName /*defaultString*/, rmFx_exportFile /*prefsName*/, 1 /*mode = modeSave*/)
-
- if (file != null) {
- reminderFox_prefsBranch.setCharPref(rmFx_exportFile, file.path);
- document.getElementById("exportFile").setAttribute("value", file.path);
- }
- }